#ifndef FPLAYER_HANDLER_H
#define FPLAYER_HANDLER_H

#include "Looper.h"

//类 处理消息的接口
class IHandlerCallback {
public:
  IHandlerCallback() = default;

  virtual ~IHandlerCallback() = default;

  virtual void handleMessage(Message *pMsg) = 0;
};


/**
 * author: x-fan
 * date: 2024/1/9
 * desc: 发送、处理消息
 */
class Handler {
private:
  IHandlerCallback *_pCallback = nullptr;
  Looper *_pLooper = nullptr;
  MessageQueue *_pMsgQueue = nullptr;

public:
  Handler();

  explicit Handler(IHandlerCallback *pCallback);

  virtual ~Handler() noexcept;

  /**
   * 发送消息
   * @param what 消息ID
   * @return true: 发送消息成功
   */
  bool sendMessage(int32_t what);

  /**
   * 发送消息
   * @param pMsg 消息体
   * @return true: 发送消息成功
   */
  bool sendMessage(Message *pMsg);

  /**
   * 消息分发 子类或者外部类处理消息
   * @param pMsg 消息体
   */
  void dispatchMessage(Message *pMsg);

  /**
   * 调用Looper.loop开始循环取消息
   */
  void loop();


  /**
   * 处理消息体
   * @param pMsg 消息体
   */
  virtual void handleMessage(Message *pMsg);
};


#endif //FPLAYER_HANDLER_H
